package cn.eeany.zutools.index.service.impl

import cn.eeany.zutools.index.DbSetting
import cn.eeany.zutools.index.MainSetting
import cn.eeany.zutools.index.event.domain.JavaFileDomain
import cn.eeany.zutools.index.exception.BizException
import cn.eeany.zutools.index.service.IFileService
import cn.hutool.crypto.SecureUtil
import org.springframework.stereotype.Service

import java.util.concurrent.ConcurrentMap


@Service
class FileService implements IFileService{
    static Map<String ,MapDb> mapDbMap =new HashMap()

    @Override
    def readFile(File file) {
        //  1 按照文件后缀来存储文件列表 .1记录文件总数 。2记录每个文件的信息（id：file+文件md5值+文件名称md5） 。3 记录文件md5值，（文件名称md5: id ）确认文件是否存在
        //TODO 2 不同的后缀文件内容发送到不同的处理方法处理，触发不同的文件类型的添加文件事件
        String filename = file.getName()
        def model =filename[filename.lastIndexOf('.')+1..filename.length()-1]
        //        println filename


        switch (model){
            case "java":
                saveJavaFile(file,model)
        }


    }

    def saveJavaFile(File file,String model){
        MapDb mapDb = new MapDb(DbSetting.dbPath, model);
        String filePathName = file.path
        String fileMd5 = SecureUtil.md5(filePathName)
        long id = mapDb.inc(model)
        ConcurrentMap<String,Long>  fileMd52id= mapDb.getTable("fileMd52id:${model}")
        if(fileMd52id.get("md5:${fileMd5}")!=null) {
            // TODO 检查是不是需要更新
//            throw new BizException()
            println "存在了"
        }
        fileMd52id.put("md5:${fileMd5}",id)
        ConcurrentMap<String,Object>  id2FileMap= mapDb.getTable("id2FileMap:${model}")
        id2FileMap.put("file:${id}",["file":filePathName,"md5":fileMd5])
        mapDb.close()
        MainSetting.eventBus.post(new JavaFileDomain(filename: file.name,fileMd5:fileMd5,id:id,filepath: file.path))
        println  file.path
    }

    @Override
    def delFile(Object file) {
        return null
    }

    @Override
    def changeFile(Object file) {
        return null
    }


    MapDb getDb(String modelname) {
        if(mapDbMap.get(modelname==null)){
            mapDbMap.put(modelname,new MapDb(DbSetting.dbPath,modelname))
        }
        return mapDbMap.get(modelname)
    }


    def getTable(String modelname,String kvTable) {
        return getDb(modelname).getTable(kvTable)
    }
}
